/***************************************************************************************************
  Copyright(C)   2011-2013
  All rights reserved.
  File Name: updatefile.h

  Description: 更新资源模块，从USB设备中检测是否有资源文件，然后进行更新，更新完成后卸载usb设备
                然后通知updatefile模块，更新完成


  ***************************************************************************************************/

#ifndef UPDATERESOURCE_H
#define UPDATERESOURCE_H

#include <QThread>
#include <QTimer>

#ifdef Q_OS_LINUX
#include <sys/socket.h>
#include <linux/netlink.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <linux/fd.h>
#include <sys/mount.h>
#include <scsi/scsi.h>
#include <scsi/sg.h>
#include <scsi/scsi_ioctl.h>
#endif


#include "public/xmlparser.h"
#include "public/configclass.h"


#define BACKUPNAME          "backup/resource"
#define UMOUNTMAXCOUNT      4     //最大的卸载次数,意味着等待时间为3+4*2=11秒


extern QString g_installPath;

bool copyDir(const QString& fromDirPath, const QString& toDirPath, bool bCoverIfFileExists);
void deleteDirectory(QFileInfo fileList);
void clearDirectory(const QString dirName);
QStringList findCEPro(const QString& usbPath);


class UpdateResource : public QObject
{
    Q_OBJECT
public:
    explicit UpdateResource(QObject *parent = 0);

    void setDriver(const QString &usbPath);

    void setUpdatePath(const QString& usbPath, const QString& backupPath);

    void startToUpdate();

private:
    QString     m_usbPath;
    QString     m_backUpPath;
    QStringList m_usbPathList;
    int         m_umountCount;

    XmlParser   *xmlParser;
    Configclass configClass;

    QTimer     *m_umountTimer;


private:
    int updateFile(const ProjectStruct& proStruct);
    bool backUpData() const;
    bool getBackUpData();


signals:
    void finish();

    //卸载USB情况,0成功,-1失败
    void umountUsbState(const int state);

    //开始更新,可能情况,proCount <= 0开始更新,proCount>0,找到更新文件的数量
    void startToUpdate(const int proCount, const QString& publishTime);

    //err：-1,xml解析出错;-2,当前版本为最新的;-3,拷贝数据库或者pro文件出错；-4,拷贝资源文件出错;-5,挂载U盘失败; -6,更新文件不齐全; ;
    //-7,更新失败，无备份文件,-8,更新失败，备份文件不齐全;
    void updateFinish(const int condition, const ProjectStruct &project);

private slots:
    void umountUsb();


};

#endif // UPDATERESOURCE_H
